//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS MigrationHubOrchestrator service.
///
/// This API reference provides descriptions, syntax, and other details about each of the actions and data types for AWS Migration Hub Orchestrator. The topic for each action shows the API request parameters and responses. Alternatively, you can use one of the AWS SDKs to access an API that is tailored to the programming language or platform that you're using.
public struct MigrationHubOrchestrator: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the MigrationHubOrchestrator client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "MigrationHubOrchestrator",
            serviceIdentifier: "migrationhub-orchestrator",
            serviceProtocol: .restjson,
            apiVersion: "2021-08-28",
            endpoint: endpoint,
            errorType: MigrationHubOrchestratorErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Creates a migration workflow template.
    @Sendable
    @inlinable
    public func createTemplate(_ input: CreateTemplateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateTemplateResponse {
        try await self.client.execute(
            operation: "CreateTemplate", 
            path: "/template", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a migration workflow template.
    ///
    /// Parameters:
    ///   - clientToken: A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see Idempotency in the Smithy documentation.
    ///   - tags: The tags to add to the migration workflow template.
    ///   - templateDescription: A description of the migration workflow template.
    ///   - templateName: The name of the migration workflow template.
    ///   - templateSource: The source of the migration workflow template.
    ///   - logger: Logger use during operation
    @inlinable
    public func createTemplate(
        clientToken: String? = CreateTemplateRequest.idempotencyToken(),
        tags: [String: String]? = nil,
        templateDescription: String? = nil,
        templateName: String,
        templateSource: TemplateSource,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateTemplateResponse {
        let input = CreateTemplateRequest(
            clientToken: clientToken, 
            tags: tags, 
            templateDescription: templateDescription, 
            templateName: templateName, 
            templateSource: templateSource
        )
        return try await self.createTemplate(input, logger: logger)
    }

    /// Create a workflow to orchestrate your migrations.
    @Sendable
    @inlinable
    public func createWorkflow(_ input: CreateMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "CreateWorkflow", 
            path: "/migrationworkflow/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a workflow to orchestrate your migrations.
    ///
    /// Parameters:
    ///   - applicationConfigurationId: The configuration ID of the application configured in Application Discovery Service.
    ///   - description: The description of the migration workflow.
    ///   - inputParameters: The input parameters required to create a migration workflow.
    ///   - name: The name of the migration workflow.
    ///   - stepTargets: The servers on which a step will be run.
    ///   - tags: The tags to add on a migration workflow.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func createWorkflow(
        applicationConfigurationId: String? = nil,
        description: String? = nil,
        inputParameters: [String: StepInput],
        name: String,
        stepTargets: [String]? = nil,
        tags: [String: String]? = nil,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateMigrationWorkflowResponse {
        let input = CreateMigrationWorkflowRequest(
            applicationConfigurationId: applicationConfigurationId, 
            description: description, 
            inputParameters: inputParameters, 
            name: name, 
            stepTargets: stepTargets, 
            tags: tags, 
            templateId: templateId
        )
        return try await self.createWorkflow(input, logger: logger)
    }

    /// Create a step in the migration workflow.
    @Sendable
    @inlinable
    public func createWorkflowStep(_ input: CreateWorkflowStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateWorkflowStepResponse {
        try await self.client.execute(
            operation: "CreateWorkflowStep", 
            path: "/workflowstep", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a step in the migration workflow.
    ///
    /// Parameters:
    ///   - description: The description of the step.
    ///   - name: The name of the step.
    ///   - next: The next step.
    ///   - outputs: The key value pairs added for the expected output.
    ///   - previous: The previous step.
    ///   - stepActionType: The action type of the step. You must run and update the status of a manual step for the workflow to continue after the completion of the step.
    ///   - stepGroupId: The ID of the step group.
    ///   - stepTarget: The servers on which a step will be run.
    ///   - workflowId: The ID of the migration workflow.
    ///   - workflowStepAutomationConfiguration: The custom script to run tests on source or target environments.
    ///   - logger: Logger use during operation
    @inlinable
    public func createWorkflowStep(
        description: String? = nil,
        name: String,
        next: [String]? = nil,
        outputs: [WorkflowStepOutput]? = nil,
        previous: [String]? = nil,
        stepActionType: StepActionType,
        stepGroupId: String,
        stepTarget: [String]? = nil,
        workflowId: String,
        workflowStepAutomationConfiguration: WorkflowStepAutomationConfiguration? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateWorkflowStepResponse {
        let input = CreateWorkflowStepRequest(
            description: description, 
            name: name, 
            next: next, 
            outputs: outputs, 
            previous: previous, 
            stepActionType: stepActionType, 
            stepGroupId: stepGroupId, 
            stepTarget: stepTarget, 
            workflowId: workflowId, 
            workflowStepAutomationConfiguration: workflowStepAutomationConfiguration
        )
        return try await self.createWorkflowStep(input, logger: logger)
    }

    /// Create a step group in a migration workflow.
    @Sendable
    @inlinable
    public func createWorkflowStepGroup(_ input: CreateWorkflowStepGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateWorkflowStepGroupResponse {
        try await self.client.execute(
            operation: "CreateWorkflowStepGroup", 
            path: "/workflowstepgroups", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a step group in a migration workflow.
    ///
    /// Parameters:
    ///   - description: The description of the step group.
    ///   - name: The name of the step group.
    ///   - next: The next step group.
    ///   - previous: The previous step group.
    ///   - workflowId: The ID of the migration workflow that will contain the step group.
    ///   - logger: Logger use during operation
    @inlinable
    public func createWorkflowStepGroup(
        description: String? = nil,
        name: String,
        next: [String]? = nil,
        previous: [String]? = nil,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateWorkflowStepGroupResponse {
        let input = CreateWorkflowStepGroupRequest(
            description: description, 
            name: name, 
            next: next, 
            previous: previous, 
            workflowId: workflowId
        )
        return try await self.createWorkflowStepGroup(input, logger: logger)
    }

    /// Deletes a migration workflow template.
    @Sendable
    @inlinable
    public func deleteTemplate(_ input: DeleteTemplateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteTemplateResponse {
        try await self.client.execute(
            operation: "DeleteTemplate", 
            path: "/template/{id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a migration workflow template.
    ///
    /// Parameters:
    ///   - id: The ID of the request to delete a migration workflow template.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteTemplate(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteTemplateResponse {
        let input = DeleteTemplateRequest(
            id: id
        )
        return try await self.deleteTemplate(input, logger: logger)
    }

    /// Delete a migration workflow. You must pause a running workflow in Migration Hub Orchestrator console to delete it.
    @Sendable
    @inlinable
    public func deleteWorkflow(_ input: DeleteMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "DeleteWorkflow", 
            path: "/migrationworkflow/{id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Delete a migration workflow. You must pause a running workflow in Migration Hub Orchestrator console to delete it.
    ///
    /// Parameters:
    ///   - id: The ID of the migration workflow you want to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteWorkflow(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteMigrationWorkflowResponse {
        let input = DeleteMigrationWorkflowRequest(
            id: id
        )
        return try await self.deleteWorkflow(input, logger: logger)
    }

    /// Delete a step in a migration workflow. Pause the workflow to delete a running step.
    @Sendable
    @inlinable
    public func deleteWorkflowStep(_ input: DeleteWorkflowStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteWorkflowStepResponse {
        try await self.client.execute(
            operation: "DeleteWorkflowStep", 
            path: "/workflowstep/{id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Delete a step in a migration workflow. Pause the workflow to delete a running step.
    ///
    /// Parameters:
    ///   - id: The ID of the step you want to delete.
    ///   - stepGroupId: The ID of the step group that contains the step you want to delete.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteWorkflowStep(
        id: String,
        stepGroupId: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteWorkflowStepResponse {
        let input = DeleteWorkflowStepRequest(
            id: id, 
            stepGroupId: stepGroupId, 
            workflowId: workflowId
        )
        return try await self.deleteWorkflowStep(input, logger: logger)
    }

    /// Delete a step group in a migration workflow.
    @Sendable
    @inlinable
    public func deleteWorkflowStepGroup(_ input: DeleteWorkflowStepGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteWorkflowStepGroupResponse {
        try await self.client.execute(
            operation: "DeleteWorkflowStepGroup", 
            path: "/workflowstepgroup/{id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Delete a step group in a migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the step group you want to delete.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteWorkflowStepGroup(
        id: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteWorkflowStepGroupResponse {
        let input = DeleteWorkflowStepGroupRequest(
            id: id, 
            workflowId: workflowId
        )
        return try await self.deleteWorkflowStepGroup(input, logger: logger)
    }

    /// Get the template you want to use for creating a migration workflow.
    @Sendable
    @inlinable
    public func getTemplate(_ input: GetMigrationWorkflowTemplateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMigrationWorkflowTemplateResponse {
        try await self.client.execute(
            operation: "GetTemplate", 
            path: "/migrationworkflowtemplate/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get the template you want to use for creating a migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func getTemplate(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMigrationWorkflowTemplateResponse {
        let input = GetMigrationWorkflowTemplateRequest(
            id: id
        )
        return try await self.getTemplate(input, logger: logger)
    }

    /// Get a specific step in a template.
    @Sendable
    @inlinable
    public func getTemplateStep(_ input: GetTemplateStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetTemplateStepResponse {
        try await self.client.execute(
            operation: "GetTemplateStep", 
            path: "/templatestep/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get a specific step in a template.
    ///
    /// Parameters:
    ///   - id: The ID of the step.
    ///   - stepGroupId: The ID of the step group.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func getTemplateStep(
        id: String,
        stepGroupId: String,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetTemplateStepResponse {
        let input = GetTemplateStepRequest(
            id: id, 
            stepGroupId: stepGroupId, 
            templateId: templateId
        )
        return try await self.getTemplateStep(input, logger: logger)
    }

    /// Get a step group in a template.
    @Sendable
    @inlinable
    public func getTemplateStepGroup(_ input: GetTemplateStepGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetTemplateStepGroupResponse {
        try await self.client.execute(
            operation: "GetTemplateStepGroup", 
            path: "/templates/{templateId}/stepgroups/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get a step group in a template.
    ///
    /// Parameters:
    ///   - id: The ID of the step group.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func getTemplateStepGroup(
        id: String,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetTemplateStepGroupResponse {
        let input = GetTemplateStepGroupRequest(
            id: id, 
            templateId: templateId
        )
        return try await self.getTemplateStepGroup(input, logger: logger)
    }

    /// Get migration workflow.
    @Sendable
    @inlinable
    public func getWorkflow(_ input: GetMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "GetWorkflow", 
            path: "/migrationworkflow/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func getWorkflow(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMigrationWorkflowResponse {
        let input = GetMigrationWorkflowRequest(
            id: id
        )
        return try await self.getWorkflow(input, logger: logger)
    }

    /// Get a step in the migration workflow.
    @Sendable
    @inlinable
    public func getWorkflowStep(_ input: GetWorkflowStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetWorkflowStepResponse {
        try await self.client.execute(
            operation: "GetWorkflowStep", 
            path: "/workflowstep/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get a step in the migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the step.
    ///   - stepGroupId: The ID of the step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func getWorkflowStep(
        id: String,
        stepGroupId: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetWorkflowStepResponse {
        let input = GetWorkflowStepRequest(
            id: id, 
            stepGroupId: stepGroupId, 
            workflowId: workflowId
        )
        return try await self.getWorkflowStep(input, logger: logger)
    }

    /// Get the step group of a migration workflow.
    @Sendable
    @inlinable
    public func getWorkflowStepGroup(_ input: GetWorkflowStepGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetWorkflowStepGroupResponse {
        try await self.client.execute(
            operation: "GetWorkflowStepGroup", 
            path: "/workflowstepgroup/{id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get the step group of a migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func getWorkflowStepGroup(
        id: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetWorkflowStepGroupResponse {
        let input = GetWorkflowStepGroupRequest(
            id: id, 
            workflowId: workflowId
        )
        return try await self.getWorkflowStepGroup(input, logger: logger)
    }

    /// List AWS Migration Hub Orchestrator plugins.
    @Sendable
    @inlinable
    public func listPlugins(_ input: ListPluginsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPluginsResponse {
        try await self.client.execute(
            operation: "ListPlugins", 
            path: "/plugins", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List AWS Migration Hub Orchestrator plugins.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of plugins that can be returned.
    ///   - nextToken: The pagination token.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPlugins(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPluginsResponse {
        let input = ListPluginsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listPlugins(input, logger: logger)
    }

    /// List the tags added to a resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the tags added to a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// List the step groups in a template.
    @Sendable
    @inlinable
    public func listTemplateStepGroups(_ input: ListTemplateStepGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTemplateStepGroupsResponse {
        try await self.client.execute(
            operation: "ListTemplateStepGroups", 
            path: "/templatestepgroups/{templateId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the step groups in a template.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - nextToken: The pagination token.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTemplateStepGroups(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTemplateStepGroupsResponse {
        let input = ListTemplateStepGroupsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            templateId: templateId
        )
        return try await self.listTemplateStepGroups(input, logger: logger)
    }

    /// List the steps in a template.
    @Sendable
    @inlinable
    public func listTemplateSteps(_ input: ListTemplateStepsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTemplateStepsResponse {
        try await self.client.execute(
            operation: "ListTemplateSteps", 
            path: "/templatesteps", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the steps in a template.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - nextToken: The pagination token.
    ///   - stepGroupId: The ID of the step group.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTemplateSteps(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        stepGroupId: String,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTemplateStepsResponse {
        let input = ListTemplateStepsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            stepGroupId: stepGroupId, 
            templateId: templateId
        )
        return try await self.listTemplateSteps(input, logger: logger)
    }

    /// List the templates available in Migration Hub Orchestrator to create a migration workflow.
    @Sendable
    @inlinable
    public func listTemplates(_ input: ListMigrationWorkflowTemplatesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMigrationWorkflowTemplatesResponse {
        try await self.client.execute(
            operation: "ListTemplates", 
            path: "/migrationworkflowtemplates", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the templates available in Migration Hub Orchestrator to create a migration workflow.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - name: The name of the template.
    ///   - nextToken: The pagination token.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTemplates(
        maxResults: Int? = nil,
        name: String? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMigrationWorkflowTemplatesResponse {
        let input = ListMigrationWorkflowTemplatesRequest(
            maxResults: maxResults, 
            name: name, 
            nextToken: nextToken
        )
        return try await self.listTemplates(input, logger: logger)
    }

    /// List the step groups in a migration workflow.
    @Sendable
    @inlinable
    public func listWorkflowStepGroups(_ input: ListWorkflowStepGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListWorkflowStepGroupsResponse {
        try await self.client.execute(
            operation: "ListWorkflowStepGroups", 
            path: "/workflowstepgroups", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the step groups in a migration workflow.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - nextToken: The pagination token.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func listWorkflowStepGroups(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListWorkflowStepGroupsResponse {
        let input = ListWorkflowStepGroupsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            workflowId: workflowId
        )
        return try await self.listWorkflowStepGroups(input, logger: logger)
    }

    /// List the steps in a workflow.
    @Sendable
    @inlinable
    public func listWorkflowSteps(_ input: ListWorkflowStepsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListWorkflowStepsResponse {
        try await self.client.execute(
            operation: "ListWorkflowSteps", 
            path: "/workflow/{workflowId}/workflowstepgroups/{stepGroupId}/workflowsteps", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the steps in a workflow.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - nextToken: The pagination token.
    ///   - stepGroupId: The ID of the step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func listWorkflowSteps(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        stepGroupId: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListWorkflowStepsResponse {
        let input = ListWorkflowStepsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            stepGroupId: stepGroupId, 
            workflowId: workflowId
        )
        return try await self.listWorkflowSteps(input, logger: logger)
    }

    /// List the migration workflows.
    @Sendable
    @inlinable
    public func listWorkflows(_ input: ListMigrationWorkflowsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMigrationWorkflowsResponse {
        try await self.client.execute(
            operation: "ListWorkflows", 
            path: "/migrationworkflows", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the migration workflows.
    ///
    /// Parameters:
    ///   - adsApplicationConfigurationName: The name of the application configured in Application Discovery Service.
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - name: The name of the migration workflow.
    ///   - nextToken: The pagination token.
    ///   - status: The status of the migration workflow.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger use during operation
    @inlinable
    public func listWorkflows(
        adsApplicationConfigurationName: String? = nil,
        maxResults: Int? = nil,
        name: String? = nil,
        nextToken: String? = nil,
        status: MigrationWorkflowStatusEnum? = nil,
        templateId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMigrationWorkflowsResponse {
        let input = ListMigrationWorkflowsRequest(
            adsApplicationConfigurationName: adsApplicationConfigurationName, 
            maxResults: maxResults, 
            name: name, 
            nextToken: nextToken, 
            status: status, 
            templateId: templateId
        )
        return try await self.listWorkflows(input, logger: logger)
    }

    /// Retry a failed step in a migration workflow.
    @Sendable
    @inlinable
    public func retryWorkflowStep(_ input: RetryWorkflowStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RetryWorkflowStepResponse {
        try await self.client.execute(
            operation: "RetryWorkflowStep", 
            path: "/retryworkflowstep/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retry a failed step in a migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the step.
    ///   - stepGroupId: The ID of the step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func retryWorkflowStep(
        id: String,
        stepGroupId: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RetryWorkflowStepResponse {
        let input = RetryWorkflowStepRequest(
            id: id, 
            stepGroupId: stepGroupId, 
            workflowId: workflowId
        )
        return try await self.retryWorkflowStep(input, logger: logger)
    }

    /// Start a migration workflow.
    @Sendable
    @inlinable
    public func startWorkflow(_ input: StartMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "StartWorkflow", 
            path: "/migrationworkflow/{id}/start", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Start a migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func startWorkflow(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartMigrationWorkflowResponse {
        let input = StartMigrationWorkflowRequest(
            id: id
        )
        return try await self.startWorkflow(input, logger: logger)
    }

    /// Stop an ongoing migration workflow.
    @Sendable
    @inlinable
    public func stopWorkflow(_ input: StopMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StopMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "StopWorkflow", 
            path: "/migrationworkflow/{id}/stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stop an ongoing migration workflow.
    ///
    /// Parameters:
    ///   - id: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopWorkflow(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopMigrationWorkflowResponse {
        let input = StopMigrationWorkflowRequest(
            id: id
        )
        return try await self.stopWorkflow(input, logger: logger)
    }

    /// Tag a resource by specifying its Amazon Resource Name (ARN).
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Tag a resource by specifying its Amazon Resource Name (ARN).
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource to which you want to add tags.
    ///   - tags: A collection of labels, in the form of key:value pairs, that apply to this resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Deletes the tags for a resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the tags for a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource from which you want to remove tags.
    ///   - tagKeys: One or more tag keys. Specify only the tag keys, not the tag values.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates a migration workflow template.
    @Sendable
    @inlinable
    public func updateTemplate(_ input: UpdateTemplateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateTemplateResponse {
        try await self.client.execute(
            operation: "UpdateTemplate", 
            path: "/template/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a migration workflow template.
    ///
    /// Parameters:
    ///   - clientToken: A unique, case-sensitive identifier that you provide to ensure the idempotency of the request.
    ///   - id: The ID of the request to update a migration workflow template.
    ///   - templateDescription: The description of the migration workflow template to update.
    ///   - templateName: The name of the migration workflow template to update.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateTemplate(
        clientToken: String? = UpdateTemplateRequest.idempotencyToken(),
        id: String,
        templateDescription: String? = nil,
        templateName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateTemplateResponse {
        let input = UpdateTemplateRequest(
            clientToken: clientToken, 
            id: id, 
            templateDescription: templateDescription, 
            templateName: templateName
        )
        return try await self.updateTemplate(input, logger: logger)
    }

    /// Update a migration workflow.
    @Sendable
    @inlinable
    public func updateWorkflow(_ input: UpdateMigrationWorkflowRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateMigrationWorkflowResponse {
        try await self.client.execute(
            operation: "UpdateWorkflow", 
            path: "/migrationworkflow/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Update a migration workflow.
    ///
    /// Parameters:
    ///   - description: The description of the migration workflow.
    ///   - id: The ID of the migration workflow.
    ///   - inputParameters: The input parameters required to update a migration workflow.
    ///   - name: The name of the migration workflow.
    ///   - stepTargets: The servers on which a step will be run.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateWorkflow(
        description: String? = nil,
        id: String,
        inputParameters: [String: StepInput]? = nil,
        name: String? = nil,
        stepTargets: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateMigrationWorkflowResponse {
        let input = UpdateMigrationWorkflowRequest(
            description: description, 
            id: id, 
            inputParameters: inputParameters, 
            name: name, 
            stepTargets: stepTargets
        )
        return try await self.updateWorkflow(input, logger: logger)
    }

    /// Update a step in a migration workflow.
    @Sendable
    @inlinable
    public func updateWorkflowStep(_ input: UpdateWorkflowStepRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateWorkflowStepResponse {
        try await self.client.execute(
            operation: "UpdateWorkflowStep", 
            path: "/workflowstep/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Update a step in a migration workflow.
    ///
    /// Parameters:
    ///   - description: The description of the step.
    ///   - id: The ID of the step.
    ///   - name: The name of the step.
    ///   - next: The next step.
    ///   - outputs: The outputs of a step.
    ///   - previous: The previous step.
    ///   - status: The status of the step.
    ///   - stepActionType: The action type of the step. You must run and update the status of a manual step for the workflow to continue after the completion of the step.
    ///   - stepGroupId: The ID of the step group.
    ///   - stepTarget: The servers on which a step will be run.
    ///   - workflowId: The ID of the migration workflow.
    ///   - workflowStepAutomationConfiguration: The custom script to run tests on the source and target environments.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateWorkflowStep(
        description: String? = nil,
        id: String,
        name: String? = nil,
        next: [String]? = nil,
        outputs: [WorkflowStepOutput]? = nil,
        previous: [String]? = nil,
        status: StepStatus? = nil,
        stepActionType: StepActionType? = nil,
        stepGroupId: String,
        stepTarget: [String]? = nil,
        workflowId: String,
        workflowStepAutomationConfiguration: WorkflowStepAutomationConfiguration? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateWorkflowStepResponse {
        let input = UpdateWorkflowStepRequest(
            description: description, 
            id: id, 
            name: name, 
            next: next, 
            outputs: outputs, 
            previous: previous, 
            status: status, 
            stepActionType: stepActionType, 
            stepGroupId: stepGroupId, 
            stepTarget: stepTarget, 
            workflowId: workflowId, 
            workflowStepAutomationConfiguration: workflowStepAutomationConfiguration
        )
        return try await self.updateWorkflowStep(input, logger: logger)
    }

    /// Update the step group in a migration workflow.
    @Sendable
    @inlinable
    public func updateWorkflowStepGroup(_ input: UpdateWorkflowStepGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateWorkflowStepGroupResponse {
        try await self.client.execute(
            operation: "UpdateWorkflowStepGroup", 
            path: "/workflowstepgroup/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Update the step group in a migration workflow.
    ///
    /// Parameters:
    ///   - description: The description of the step group.
    ///   - id: The ID of the step group.
    ///   - name: The name of the step group.
    ///   - next: The next step group.
    ///   - previous: The previous step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateWorkflowStepGroup(
        description: String? = nil,
        id: String,
        name: String? = nil,
        next: [String]? = nil,
        previous: [String]? = nil,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateWorkflowStepGroupResponse {
        let input = UpdateWorkflowStepGroupRequest(
            description: description, 
            id: id, 
            name: name, 
            next: next, 
            previous: previous, 
            workflowId: workflowId
        )
        return try await self.updateWorkflowStepGroup(input, logger: logger)
    }
}

extension MigrationHubOrchestrator {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: MigrationHubOrchestrator, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension MigrationHubOrchestrator {
    /// Return PaginatorSequence for operation ``listPlugins(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPluginsPaginator(
        _ input: ListPluginsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPluginsRequest, ListPluginsResponse> {
        return .init(
            input: input,
            command: self.listPlugins,
            inputKey: \ListPluginsRequest.nextToken,
            outputKey: \ListPluginsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPlugins(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of plugins that can be returned.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPluginsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPluginsRequest, ListPluginsResponse> {
        let input = ListPluginsRequest(
            maxResults: maxResults
        )
        return self.listPluginsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTemplateStepGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplateStepGroupsPaginator(
        _ input: ListTemplateStepGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTemplateStepGroupsRequest, ListTemplateStepGroupsResponse> {
        return .init(
            input: input,
            command: self.listTemplateStepGroups,
            inputKey: \ListTemplateStepGroupsRequest.nextToken,
            outputKey: \ListTemplateStepGroupsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTemplateStepGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplateStepGroupsPaginator(
        maxResults: Int? = nil,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTemplateStepGroupsRequest, ListTemplateStepGroupsResponse> {
        let input = ListTemplateStepGroupsRequest(
            maxResults: maxResults, 
            templateId: templateId
        )
        return self.listTemplateStepGroupsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTemplateSteps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplateStepsPaginator(
        _ input: ListTemplateStepsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTemplateStepsRequest, ListTemplateStepsResponse> {
        return .init(
            input: input,
            command: self.listTemplateSteps,
            inputKey: \ListTemplateStepsRequest.nextToken,
            outputKey: \ListTemplateStepsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTemplateSteps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - stepGroupId: The ID of the step group.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplateStepsPaginator(
        maxResults: Int? = nil,
        stepGroupId: String,
        templateId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTemplateStepsRequest, ListTemplateStepsResponse> {
        let input = ListTemplateStepsRequest(
            maxResults: maxResults, 
            stepGroupId: stepGroupId, 
            templateId: templateId
        )
        return self.listTemplateStepsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTemplates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplatesPaginator(
        _ input: ListMigrationWorkflowTemplatesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMigrationWorkflowTemplatesRequest, ListMigrationWorkflowTemplatesResponse> {
        return .init(
            input: input,
            command: self.listTemplates,
            inputKey: \ListMigrationWorkflowTemplatesRequest.nextToken,
            outputKey: \ListMigrationWorkflowTemplatesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTemplates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - name: The name of the template.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTemplatesPaginator(
        maxResults: Int? = nil,
        name: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMigrationWorkflowTemplatesRequest, ListMigrationWorkflowTemplatesResponse> {
        let input = ListMigrationWorkflowTemplatesRequest(
            maxResults: maxResults, 
            name: name
        )
        return self.listTemplatesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listWorkflowStepGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowStepGroupsPaginator(
        _ input: ListWorkflowStepGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListWorkflowStepGroupsRequest, ListWorkflowStepGroupsResponse> {
        return .init(
            input: input,
            command: self.listWorkflowStepGroups,
            inputKey: \ListWorkflowStepGroupsRequest.nextToken,
            outputKey: \ListWorkflowStepGroupsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listWorkflowStepGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowStepGroupsPaginator(
        maxResults: Int? = nil,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListWorkflowStepGroupsRequest, ListWorkflowStepGroupsResponse> {
        let input = ListWorkflowStepGroupsRequest(
            maxResults: maxResults, 
            workflowId: workflowId
        )
        return self.listWorkflowStepGroupsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listWorkflowSteps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowStepsPaginator(
        _ input: ListWorkflowStepsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListWorkflowStepsRequest, ListWorkflowStepsResponse> {
        return .init(
            input: input,
            command: self.listWorkflowSteps,
            inputKey: \ListWorkflowStepsRequest.nextToken,
            outputKey: \ListWorkflowStepsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listWorkflowSteps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - stepGroupId: The ID of the step group.
    ///   - workflowId: The ID of the migration workflow.
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowStepsPaginator(
        maxResults: Int? = nil,
        stepGroupId: String,
        workflowId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListWorkflowStepsRequest, ListWorkflowStepsResponse> {
        let input = ListWorkflowStepsRequest(
            maxResults: maxResults, 
            stepGroupId: stepGroupId, 
            workflowId: workflowId
        )
        return self.listWorkflowStepsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listWorkflows(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowsPaginator(
        _ input: ListMigrationWorkflowsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMigrationWorkflowsRequest, ListMigrationWorkflowsResponse> {
        return .init(
            input: input,
            command: self.listWorkflows,
            inputKey: \ListMigrationWorkflowsRequest.nextToken,
            outputKey: \ListMigrationWorkflowsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listWorkflows(_:logger:)``.
    ///
    /// - Parameters:
    ///   - adsApplicationConfigurationName: The name of the application configured in Application Discovery Service.
    ///   - maxResults: The maximum number of results that can be returned.
    ///   - name: The name of the migration workflow.
    ///   - status: The status of the migration workflow.
    ///   - templateId: The ID of the template.
    ///   - logger: Logger used for logging
    @inlinable
    public func listWorkflowsPaginator(
        adsApplicationConfigurationName: String? = nil,
        maxResults: Int? = nil,
        name: String? = nil,
        status: MigrationWorkflowStatusEnum? = nil,
        templateId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMigrationWorkflowsRequest, ListMigrationWorkflowsResponse> {
        let input = ListMigrationWorkflowsRequest(
            adsApplicationConfigurationName: adsApplicationConfigurationName, 
            maxResults: maxResults, 
            name: name, 
            status: status, 
            templateId: templateId
        )
        return self.listWorkflowsPaginator(input, logger: logger)
    }
}

extension MigrationHubOrchestrator.ListMigrationWorkflowTemplatesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListMigrationWorkflowTemplatesRequest {
        return .init(
            maxResults: self.maxResults,
            name: self.name,
            nextToken: token
        )
    }
}

extension MigrationHubOrchestrator.ListMigrationWorkflowsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListMigrationWorkflowsRequest {
        return .init(
            adsApplicationConfigurationName: self.adsApplicationConfigurationName,
            maxResults: self.maxResults,
            name: self.name,
            nextToken: token,
            status: self.status,
            templateId: self.templateId
        )
    }
}

extension MigrationHubOrchestrator.ListPluginsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListPluginsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension MigrationHubOrchestrator.ListTemplateStepGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListTemplateStepGroupsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            templateId: self.templateId
        )
    }
}

extension MigrationHubOrchestrator.ListTemplateStepsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListTemplateStepsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            stepGroupId: self.stepGroupId,
            templateId: self.templateId
        )
    }
}

extension MigrationHubOrchestrator.ListWorkflowStepGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListWorkflowStepGroupsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            workflowId: self.workflowId
        )
    }
}

extension MigrationHubOrchestrator.ListWorkflowStepsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHubOrchestrator.ListWorkflowStepsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            stepGroupId: self.stepGroupId,
            workflowId: self.workflowId
        )
    }
}
